//////////////////////////////////////////////////////////////////////////

#ifndef _SERVERCONNECTION_H_
#define _SERVERCONNECTION_H_

//////////////////////////////////////////////////////////////////////////

#ifndef _ISERVERCONNECTION_H_
#include "iserverconnection.h"
#endif

#ifndef _CONNECTION_H_
#include "connection.h"
#endif

#ifndef _NETWORKFACTORY_H_
#include "networkfactory.h"
#endif

class UDPServer;

//////////////////////////////////////////////////////////////////////////



/** TCP connection between server and client on server side
*
*  @author   Pasechnik Roman
*  @author   Anastasia Karpinska
*  @since    Jun 30th, 2009
*  @updated  Jan 18th, 2010
*/
class ServerConnection : public IServerConnection,
                         public Connection
{
//////////////////////////////////////////////////////////////////////////

public:

//////////////////////////////////////////////////////////////////////////


    /** Constructor */
    ServerConnection( int _ID, const AcceptorPtr& _clientSocket );


    /** Destructor */
    virtual ~ServerConnection();


//////////////////////////////////////////////////////////////////////////


    /** Get connection ID */
    virtual int GetID() const;


    /** Sends UDP */
    virtual void SendUDP( const NetworkPacket& _data );


    /** Handle received UDP packet */
    void HandleRecvUDP( const char* _data, size_t _dataSize );


    /** Set connection UDP endpoint or check endpoint validity */
    void SetUDPEndpoint( boost::asio::ip::udp::endpoint& _endpoint );


//////////////////////////////////////////////////////////////////////////

private:

//////////////////////////////////////////////////////////////////////////


    /** Connection ID */
    int m_ID;


    /** Connection UDP endpoint */
    boost::asio::ip::udp::endpoint m_Endpoint;


    /** Can we use UDP for sending packets? */
    bool m_CanUseUDP;


    /** UDP Server interface */
    UDPServer& m_UDPServer;


//////////////////////////////////////////////////////////////////////////
};


//////////////////////////////////////////////////////////////////////////

#endif

//////////////////////////////////////////////////////////////////////////
